package com.ruoyi.common.utils;

import java.util.List;

/**
 * @date: 2022/08/05
 * @FileName: TreeNode
 * @author: wangjie
 * @Des: 树节点父类，所有需要使用TreeUtils工具类形成树形结构等操作的节点都需要实现该接口
 */
public interface ITreeNode<T, RC, LC> {

    /**
     * 获取树结点id
     * @return
     */
    T getTreeNodeId();

    /**
     * 获取该节点的父节点id
     * @return
     */
    T getParentId();

    /**
     * 判断该节点是否为根节点，默认判定
     * @Des 可以用于简单树的组件
     * @return
     */
    boolean isRoot();

    /**
     * 自定义父结点的判定规则
     * @param rootCondition
     * @return
     */
    boolean isRoot(RC rootCondition);

    /**
     * 自定义子节点(叶子结点)的判定规则
     * @param leafCondition
     * @return
     */
    boolean isChildren(LC leafCondition);

    /**
     * 判断是否有子节点
     * @return
     */
    boolean hasChild();

    /**
     * 设置结点的子节点列表
     * @param children
     */
    void setChildren(List<? extends ITreeNode<T, RC, LC>> children);

    /**
     * 获取所有子节点
     * @return
     */
    List<? extends ITreeNode<T, RC, LC>> getChildren();

    /**
     * 获取树的深度
     * @return
     */
    Integer getLevel();

    /**
     * 设置树的深度
     */
    void setLevel(Integer level);

    /**
     * 获取树的名称
     * @return
     */
    String getName();

    /**
     * 设置树的名称
     */
    void setName(String name);

    /**
     * 获取树的父级名称
     * @return
     */
    String getParentName();

    /**
     * 设置树的父级名称
     */
    void setParentName(String parentName);
}